home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / SOUND / CRYS270.ZIP / SNDBLAST.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-06-26  |  11.2 KB  |  691 lines

  1. ;***************************************************************************
  2. ;*    Driver pour la Sound Blaster (calcul 10bits)
  3. ;*
  4. ;* Programmé par Sébastien Granjoux
  5. ;* Commencé le 11/01/95
  6. ;* Modification le 11/01/95
  7.  
  8. IDEAL
  9. P386N
  10.  
  11. INCLUDE "CRYSERR.INC"
  12. INCLUDE "CRYSDEV.INC"
  13. INCLUDE "CRYSLOAD.INC"
  14.  
  15. PUBLIC    USESB
  16.  
  17. SEGMENT CODE PARA PUBLIC USE16 'CODE'
  18.  
  19. ASSUME cs:CODE,ds:CODE
  20.  
  21. NO_FILTER    EQU    3600
  22. LOW_FILTER    EQU    1800
  23.  
  24. ;*************************************************************************
  25. ;*    Fonction de détection du driver
  26.  
  27. PROC    USESB
  28.  
  29.     call    USEDEVICE
  30.     DEVICE <03,'BLASTERs=ApIiDd!Tt13$',OFFSET setsb,OFFSET startsb,OFFSET stopsb,OFFSET makesb,OFFSET defbpm,OFFSET peekdef,0,0,1>
  31.  
  32. ENDP
  33.  
  34. SbLen     DW    ?
  35. DspVer   DW    0
  36. Count    DW    0
  37. DmaPage  DB     87h,83h,82h,81h
  38.  
  39. ;***************************************************************************
  40. ;*    Attente d'une autorisation d'écriture
  41. ;*
  42. ;* Entrée:
  43. ;*    DX    port d'écriture 2XC
  44. ;*
  45. ;* Sortie:
  46. ;*    DX    port d'écriture 2XC
  47.  
  48. PROC    waitsb
  49.  
  50. @@wait:
  51.     in    al,dx
  52.     or    al,al
  53.     js    @@wait
  54.  
  55.     ret
  56. ENDP
  57.  
  58. ;***************************************************************************
  59. ;*    Attente d'une lecture sur un port de la SB
  60. ;*
  61. ;* Entrée:
  62. ;*    DX    adresse de port du status en lecture 2XE
  63. ;*
  64. ;* Sortie:
  65. ;*    AL    résultat de la lecture
  66. ;*    DX    adresse de port de lecture 2XA
  67.  
  68. PROC    readsb
  69.  
  70. @@wait:
  71.     in    al,dx
  72.     or    al,al
  73.     jns    @@wait
  74.     sub    dx,4
  75.     in    al,dx
  76.  
  77.     ret
  78. ENDP
  79.  
  80.  
  81. ;***************************************************************************
  82. ;*    Reset de la Soundblaster (recupère l'adresse de port)
  83. ;*
  84. ;* Entrée:
  85. ;*    DS:SI    adresse de la structure device
  86. ;*
  87. ;* Sortie:
  88. ;*    DX    adresse de port du reset 2X6
  89.  
  90. PROC    resetsb
  91.  
  92.     mov    dx,[(DEVICE ptr ds:si).port]
  93.     add    dx,6
  94.     mov    al,1
  95.     out    dx,al
  96.     mov    cx,1024    ;compte des moutons pendant au moins 3µs
  97. @@compte:
  98.     loop    @@compte
  99.     dec    al
  100.     out    dx,al
  101.     ret
  102.  
  103. ENDP
  104.  
  105. ;***************************************************************************
  106. ;*    routine permettant d'initialiser le son sur la soundblaster
  107.  
  108. PROC    setsb
  109.  
  110.     call    resetsb
  111.  
  112.     add    dx,8
  113.     mov    cx,1024
  114. @@wait:
  115.     in    al,dx
  116.     or    al,al
  117.     js    @@test
  118.     loop    @@wait
  119.  
  120. @@no_sb:
  121.     stc
  122.     mov    ax,SB_NOT_FOUND
  123.     ret
  124.  
  125. @@test:
  126.     sub    dx,4
  127.     in    al,dx
  128.     cmp    al,0aah
  129.     jne    @@no_sb
  130.  
  131.     add    dx,2
  132.     call    waitsb
  133.     mov    al,0E1h
  134.     out    dx,al
  135.  
  136.     add    dx,2
  137.     call    readsb
  138.     mov    ah,al
  139.     add    dx,4
  140.     call    readsb
  141.     mov    [DspVer],ax
  142.  
  143.     add    dx,4
  144.     mov    [cs:OFFSET port_sb+1],dx
  145.     mov    [cs:OFFSET port_sb3+1],dx
  146.     sub    dx,0eh
  147.     mov    [(DEVICE ptr ds:si).port],dx
  148.  
  149.     mov    al,20h
  150.     cmp    [(DEVICE ptr ds:si).irq],8
  151.     jb    @@first_pic
  152.     mov    al,0A0h
  153. @@first_pic:
  154.     mov    [cs:OFFSET port_irq+1],al
  155.     mov    [cs:OFFSET port_irq3+1],al
  156.  
  157.     xor    al,al         ;efface la bascule interne
  158.     out    0ch,al
  159.  
  160.     xor    dx,dx
  161.     mov    al,[(DEVICE PTR ds:si).dma]
  162.     mov    dl,al
  163.     add    dl,al
  164.     or    al,4          ;masque le canal DMA
  165.     out    0ah,al
  166.  
  167.     and     al,0FBh
  168.     or    al,58h
  169.     out    0bh,al        ;choix du mode
  170.  
  171.     mov    ax,cs
  172.     mov     cx,ax
  173.     shr    ch,4
  174.     shl    ax,4
  175.     add    ax,OFFSET SoundBuf
  176.     cmp    ax,65536-BUF_LEN
  177.     jb    @@ok1
  178.     add    ax,BUF_LEN
  179.     adc    ch,0
  180.     mov    bx,OFFSET SoundBuf
  181.     mov    [word ptr cs:OFFSET soundbuf1b+2],bx
  182.     mov    [word ptr cs:OFFSET soundbuf2b+2],bx
  183.     mov    [word ptr cs:OFFSET soundbuf3b+2],bx
  184.     inc    bx
  185.     mov    [word ptr cs:OFFSET soundbuf4b+2],bx
  186.     mov    [word ptr cs:OFFSET soundbuf5b+2],bx
  187.     add    bx,BUF_LEN
  188.     mov    [word ptr cs:OFFSET soundbuf4+2],bx
  189.     mov    [word ptr cs:OFFSET soundbuf5+2],bx
  190.     mov    [word ptr cs:OFFSET soundbuf7+2],bx
  191.     dec    bx
  192.     mov    [word ptr cs:OFFSET soundbuf1+2],bx
  193.     mov    [word ptr cs:OFFSET soundbuf2+2],bx
  194.     mov    [word ptr cs:OFFSET soundbuf3+2],bx
  195.     mov    [word ptr cs:OFFSET soundbuf6+2],bx
  196. @@ok1:
  197.  
  198.     out    dx,al        ; place l'adresse de base
  199.     mov    al,ah
  200.     out    dx,al
  201.     mov    ax,BUF_LEN
  202.     dec    ax
  203.     inc    dx
  204.     out    dx,al        ; place la longueur du bloc
  205.     mov    al,ah
  206.     out    dx,al
  207.     mov        bx,OFFSET DmaPage
  208.     mov    al,[(DEVICE PTR ds:si).dma]
  209.     xlat
  210.     mov    dl,al
  211.     mov    al,ch
  212.     out    dx,al
  213.  
  214.     mov     cl,[NbVoice]
  215.     mov     al,cl
  216.     mov     ah,-1
  217. @@find_msbit:
  218.     inc     ah
  219.     shr     al,1
  220.     jne     @@find_msbit
  221.     mov     [cs:OFFSET nbvoicediv1+2],ah
  222.     mov     [cs:OFFSET nbvoicediv2+2],ah
  223.     call    caloptvoltab
  224.  
  225.     clc
  226.  
  227.     ret
  228.  
  229. ENDP
  230.  
  231. ;***************************************************************************
  232. ;*    routine permettant de démarrer l'envoit du son sur la soundblaster
  233.  
  234. PROC    startsb
  235.  
  236.     mov    ax,[VoicesLen]
  237.     xor    cl,cl
  238. @@search_msb:
  239.     inc    cl
  240.     shr    ax,1
  241.     jne    @@search_msb
  242.     sub        cl,2
  243.     mov    ax,1
  244.     shl    ax,cl
  245.     mov    [SbLen],ax
  246.  
  247.     mov    ax,OFFSET soundsing
  248.     cmp    [DspVer],200h
  249.     jbe    @@old_sb
  250.     mov    ax,OFFSET soundauto
  251. @@old_sb:
  252.     mov    dx,cs
  253.     mov    bl,[(DEVICE PTR ds:si).irq]
  254.     call    setirq
  255.  
  256.     mov    al,[(DEVICE PTR ds:si).dma]
  257.     out    0ah,al        ; autorise le canal DMA
  258.  
  259.     mov     dx,1
  260.     mov    ax,086A0h    ;1000000/frequence
  261.     div    [MixRate]
  262.     neg    ax
  263.     mov    ah,al
  264.  
  265.     mov    dx,[(DEVICE PTR ds:si).port]
  266.     add    dx,04
  267.     mov    al,0Eh        ; Enleve le filtre de sortie pour f>36Khz
  268.     out    dx,al
  269.     inc    dx
  270.     in    al,dx
  271.     and    al,0DFh
  272.     cmp    [ds:MixRate],NO_FILTER
  273.     jbe    @@filter_on
  274.     or    al,20h
  275. @@filter_on:
  276.     out    dx,al
  277.  
  278.     dec    dx              ; regle la fréquence du filtre
  279.     mov    al,0Ch
  280.     out    dx,al
  281.     inc    dx
  282.     in    al,dx
  283.     and    al,0F7h
  284.     cmp    [ds:MixRate],LOW_FILTER
  285.     jbe    @@filter32
  286.     or    al,08h
  287. @@filter32:
  288.     out    dx,al
  289.  
  290.     add    dx,07h
  291.     call    waitsb
  292.     mov    al,0d1h
  293.     out    dx,al            ; allume le haut parleur
  294.  
  295.     call    waitsb
  296.     mov    al,40h
  297.     out    dx,al
  298.     call    waitsb
  299.     mov    al,ah
  300.     out    dx,al        ; regle la fréquence
  301.  
  302.      cmp  [DspVer],200h
  303.      ja   @@new_sb
  304.  
  305.     call    waitsb
  306.     mov    al,14h
  307.     out    dx,al        ; met en marche le transfert
  308.     call    waitsb
  309.     mov    ax,[ds:SbLen]
  310.     dec    ax
  311.     out    dx,al
  312.     call    waitsb
  313.     mov    al,ah
  314.     out    dx,al
  315.  
  316.     ret
  317.  
  318. @@new_sb:
  319.  
  320.     call    waitsb
  321.     mov    al,48h
  322.     out    dx,al
  323.     call    waitsb
  324.     mov    ax,[cs:SbLen]
  325.     dec    ax
  326.     out     dx,al
  327.     call    waitsb
  328.     mov    al,ah
  329.     out    dx,al
  330.  
  331.     call    waitsb
  332.     mov    al,90h
  333.     out    dx,al
  334.  
  335.     ret
  336.  
  337. ENDP
  338.  
  339. ;**************************************************************************
  340. ;*    cette procédure est en fait un bloc que l'on doit mettre à
  341. ;*    l'adresse Voices
  342.  
  343. PROC    makesb FAR
  344.  
  345.     mov    cl,[NbVoice]
  346.     sub    cl,2
  347.     push    cx
  348.  
  349.     mov    di,OFFSET Voice1
  350.     mov     dx,[(VOICE PTR di).effet]
  351.     call    dx
  352.  
  353.     mov    di,[ds:OFFSET SoundPage]
  354.  
  355.     mov    bx,[(VOICE PTR Voice1).play]
  356.     shl    bx,1
  357.     xor    edx,edx
  358.     mov    dx,[word ptr ds:bx+OFFSET Notes]
  359.  
  360.     ror    edx,10
  361.     mov    cx,[(VOICE PTR Voice1).samplen]
  362.     les    esi,[(VOICE PTR Voice1).adrvoc]
  363.     mov    bx,[(VOICE PTR Voice1).replen]
  364.     cmp    si,cx
  365.     jbe    @@ok1
  366. @@adjust1:
  367.     sub    si,bx
  368.     cmp    si,cx
  369.     ja    @@adjust1
  370. @@ok1:
  371.  
  372.     mov    bx,OFFSET VolumeTab
  373.     mov    al,[MasterVol]
  374.     and    al,[(VOICE PTR Voice1).mute]
  375.     mul    [(VOICE PTR Voice1).volume]
  376.     add    bh,ah
  377.  
  378.     push    ebp
  379. @@voix1:
  380.     add     esi,edx
  381.     mov    al,[byte ptr es:si]
  382.     adc    esi,edx
  383.     xlat
  384.     mov    ah,al
  385.     mov    al,[byte ptr es:si]
  386.     adc    si,0
  387.     xlat
  388. soundbuf1:
  389.     mov    [ds:di+OFFSET SoundBuf],ax
  390. soundbuf1b:
  391.     mov    [word ptr ds:di+OFFSET SoundBuf+BUF_LEN],0
  392.     add    di,2
  393.  
  394.     cmp    di,bp
  395.     jne    @@voix1
  396.     rol    ebp,16
  397.     xor    di,di
  398.     cmp    bp,BUF_LEN
  399.     jne    @@voix1
  400.     pop    ebp
  401.  
  402.     mov    [dword ptr ((VOICE PTR Voice1).adrvoc)],esi
  403.  
  404.     pop    cx
  405.     mov    di,OFFSET Voice1+SIZE VOICE
  406. @@next_voice:
  407.     push    cx
  408.     mov     dx,[(VOICE ptr ds:di).effet]
  409.     call    dx
  410.  
  411.     mov    bx,[(VOICE ptr ds:di).play]
  412.     shl    bx,1
  413.     xor    edx,edx
  414.     mov    dx,[word ptr ds:bx+OFFSET Notes]
  415.     ror    edx,10
  416.     mov    cx,[(VOICE ptr ds:di).samplen]
  417.     les    esi,[(VOICE ptr ds:di).adrvoc]
  418.     mov    bx,[(VOICE ptr ds:di).replen]
  419.     cmp    si,cx
  420.     jbe    @@ok2
  421. @@adjust2:
  422.     sub    si,bx
  423.     cmp    si,cx
  424.     ja    @@adjust2
  425. @@ok2:
  426.  
  427.     mov    bx,OFFSET VolumeTab
  428.     mov    al,[MasterVol]
  429.     and    al,[(VOICE PTR ds:di).mute]
  430.     mul    [(VOICE PTR ds:di).volume]
  431.     add    bh,ah
  432.  
  433.     push    di
  434.  
  435.     push    ebp
  436.     mov    di,[ds:OFFSET SoundPage]
  437. @@voix2:
  438.     add     esi,edx
  439.     mov    al,[byte ptr es:si]
  440.     adc    esi,edx
  441.     xlat
  442.     mov    ah,al
  443.     mov    al,[byte ptr es:si]
  444.     adc    si,0
  445.     xlat
  446. soundbuf2:
  447.     add    [ds:di+OFFSET SoundBuf],al
  448. soundbuf2b:
  449.     adc    [byte ptr ds:di+OFFSET SoundBuf+BUF_LEN],0
  450. soundbuf4:
  451.     add    [ds:di+OFFSET SoundBuf+1],ah
  452. soundbuf4b:
  453.     adc    [byte ptr ds:di+OFFSET SoundBuf+BUF_LEN+1],0
  454.     add    di,2
  455.  
  456.     cmp    di,bp
  457.     jne    @@voix2
  458.     rol    ebp,16
  459.     xor    di,di
  460.     cmp    bp,BUF_LEN
  461.     jne    @@voix2
  462.     pop    ebp
  463.  
  464.  
  465.     pop    di
  466.     mov    [dword ptr ((VOICE ptr ds:di).adrvoc)],esi
  467.     add    di,SIZE VOICE
  468.     pop    cx
  469.     dec    cl
  470.     jne    @@next_voice
  471.  
  472.     mov     dx,[(VOICE ptr ds:di).effet]
  473.     call    dx
  474.  
  475.     mov    bx,[(VOICE ptr ds:di).play]
  476.     shl    bx,1
  477.     xor    edx,edx
  478.     mov    dx,[word ptr ds:bx+OFFSET Notes]
  479.     ror    edx,10
  480.     mov    cx,[(VOICE ptr ds:di).samplen]
  481.     les    esi,[(VOICE ptr ds:di).adrvoc]
  482.     mov    bx,[(VOICE ptr ds:di).replen]
  483.     cmp    si,cx
  484.     jbe    @@ok4
  485. @@adjust4:
  486.     sub    si,bx
  487.     cmp    si,cx
  488.     ja    @@adjust4
  489. @@ok4:
  490.  
  491.     mov    bx,OFFSET VolumeTab
  492.     mov    al,[MasterVol]
  493.     and    al,[(VOICE ptr ds:di).mute]
  494.     mul    [(VOICE ptr ds:di).volume]
  495.     add    bh,ah
  496.  
  497.     push    di
  498.     mov    di,[ds:OFFSET SoundPage]
  499.     xor    ah,ah
  500. @@voix4:
  501.     add     esi,edx
  502.     mov    al,[byte ptr es:si]
  503.     adc    si,0
  504.     xlat
  505. soundbuf3:
  506.     add    al,[ds:di+OFFSET SoundBuf]
  507. soundbuf3b:
  508.     adc    ah,[ds:di+OFFSET SoundBuf+BUF_LEN]
  509. nbvoicediv1:
  510.     shr    ax,2
  511.  
  512. soundbuf6:
  513.     mov    [byte ptr ds:di+OFFSET SoundBuf],al
  514.     add    esi,edx
  515.     mov    al,[byte ptr es:si]
  516.     adc    si,0
  517.     xlat
  518. soundbuf5:
  519.     add    al,[ds:di+OFFSET SoundBuf+1]
  520. soundbuf5b:
  521.     adc    ah,[ds:di+OFFSET SoundBuf+BUF_LEN+1]
  522. nbvoicediv2:
  523.     shr    ax,2
  524.  
  525. soundbuf7:
  526.     mov    [byte ptr ds:di+OFFSET SoundBuf+1],al
  527.     add    di,2
  528.  
  529.     cmp    di,bp
  530.     jne    @@voix4
  531.     rol    ebp,16
  532.     xor    di,di
  533.     cmp    bp,BUF_LEN
  534.     jne    @@voix4
  535.  
  536.     pop    di
  537.     mov    [dword ptr ((VOICE ptr ds:di).adrvoc)],esi
  538.  
  539. @@fin4voice:
  540.  
  541.     shr    ebp,16
  542.     and    bp,65535-BUF_LEN
  543.     mov    [word ptr ds:OFFSET SoundPage],bp
  544.     mov    [byte ptr cs:OFFSET switch_makemod],1Eh
  545.  
  546.     pop    edi
  547.     pop    esi
  548.     pop    ebp
  549.     pop    es
  550.     pop    ds
  551.  
  552.     ret
  553.  
  554. ENDP
  555.  
  556. ;***************************************************************************
  557. ;*    Cette routine remplace d'interruption de la sound blaster
  558.  
  559. PROC    soundsing
  560.  
  561.     push    ax
  562.     push    dx
  563.  
  564. port_sb:
  565.     mov    dx,22eh
  566.     in    al,dx
  567.     sub    dx,2
  568.  
  569. @@wait1:
  570.     in    al,dx
  571.     or    al,al
  572.     js    @@wait1
  573.     mov    al,14h
  574.     out    dx,al
  575.  
  576. @@wait2:
  577.     in    al,dx
  578.     or    al,al
  579.     js    @@wait2
  580.     mov    ax,[cs:SbLen]
  581.     add    [cs:SoundPtr],ax
  582.     and     [cs:SoundPtr],65535-BUF_LEN
  583.     dec    ax
  584.     out     dx,al
  585.  
  586. @@wait3:
  587.     in    al,dx
  588.     or    al,al
  589.     js    @@wait3
  590.     mov    al,ah
  591.     out    dx,al
  592.  
  593.     mov    al,20h
  594.     out    20h,al
  595. port_irq:
  596.     out    20h,al
  597.     pop    dx
  598.  
  599.     mov    ax,[cs:SbLen]
  600.     sub    [cs:Count],ax
  601.     jle    @@imakemod
  602.     pop    ax
  603.  
  604.     iret
  605.  
  606. @@imakemod:
  607.     mov    ax,[cs:VoicesLen]
  608.     add    [cs:Count],ax
  609.     pop    ax
  610.  
  611.     jmp    IMAKEMOD
  612.  
  613. ENDP
  614.  
  615. ;***************************************************************************
  616. ;*    Cette routine remplace d'interruption de la sound blaster
  617.  
  618. PROC    soundauto
  619.  
  620.     push    ax
  621.     push    dx
  622.  
  623. port_sb3:
  624.     mov    dx,22eh
  625.     in    al,dx
  626.  
  627.     mov    ax,[cs:SbLen]
  628.     add    [cs:SoundPtr],ax
  629.     and     [cs:SoundPtr],65535-BUF_LEN
  630.  
  631.     mov    al,20h
  632.     out    20h,al
  633. port_irq3:
  634.     out    20h,al
  635.     pop    dx
  636.  
  637.     mov    ax,[cs:SbLen]
  638.     sub    [cs:Count],ax
  639.     jle    @@imakemod
  640.     pop    ax
  641.  
  642.     iret
  643.  
  644. @@imakemod:
  645.     mov    ax,[cs:VoicesLen]
  646.     add    [cs:Count],ax
  647.     pop    ax
  648.  
  649.     jmp    IMAKEMOD
  650.  
  651. ENDP
  652.  
  653. ;***************************************************************************
  654. ;*    Cette routine permet d'arreter l'envoit du son sur une soundblaster
  655.  
  656. PROC    stopsb
  657.  
  658.     call    resetsb
  659.  
  660.     mov    al,[(DEVICE PTR ds:si).dma]      ; masque le canal DMA
  661.     or    al,4
  662.     out    0ah,al
  663.  
  664.     add    dx,6
  665.     call    waitsb
  666.     mov    al,0d3h
  667.     out    dx,al        ; éteint le haut parleur
  668.  
  669.     sub    dx,08
  670.     mov    al,0Eh        ; remet le filtre
  671.     out    dx,al
  672.     inc    dx
  673.     in    al,dx
  674.     and    al,0DFh
  675.     out    dx,al
  676.  
  677.     dec    dx            ; remet le filtre à 3.2Khz
  678.     mov    al,0Ch
  679.     out    dx,al
  680.     inc    dx
  681.     in    al,dx
  682.     and    al,0F7h
  683.     out    dx,al
  684.  
  685.     ret
  686.  
  687. ENDP
  688.  
  689. ENDS
  690.  
  691. END